package control;
import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import control.AreaAtuacaoHandler;
import control.ArtigoHandler;
import control.AssociadoHandler;

import model.AcessoMenuOpcao;
import model.AcessoUsuario;
import model.AcessoUsuarioPermissao;
import model.TipoCadastro;
import business.AcessoUsuarioPermissaoDAO;
@ManagedBean(name="acessoUsuarioPermissaoHandler")
@SessionScoped

public class AcessoUsuarioPermissaoHandler implements Serializable {
	private static final long serialVersionUID = 1L;
	private AcessoUsuarioPermissaoDAO acessoUsuarioPermissaoDAO = AcessoUsuarioPermissaoDAO.getInstance();
	private List<AcessoUsuarioPermissao> menu 		= null;
	private AcessoUsuario acessoUsuario 			;
	private AcessoUsuarioPermissao usuarioPermissao	= new AcessoUsuarioPermissao();
	private String titulo;
	
	public AcessoUsuarioPermissaoDAO getAcessoOpcaoUsuarioDAO() {
		return this.acessoUsuarioPermissaoDAO;
	}

	public void setAcessoOpcaoUsuarioDAO(AcessoUsuarioPermissaoDAO acessoUsuarioPermissaoDAO) {
		this.acessoUsuarioPermissaoDAO = acessoUsuarioPermissaoDAO;
	}

	public AcessoUsuario getUsuario() {
		return acessoUsuario;
	}
	
	public void setUsuario(AcessoUsuario acessoUsuario) {
		this.acessoUsuario = acessoUsuario;
	}
	
	public List<AcessoUsuarioPermissao> getMenu() {
		if(this.menu == null) {
			FacesContext context = FacesContext.getCurrentInstance();
			this.setUsuario((AcessoUsuario) context.getAttributes().get("usuarioLogado"));
	//		this.setUsuario((AcessoUsuario) this.session.get("usuarioLogado", acessoUsuario));
			this.menu = this.acessoUsuarioPermissaoDAO.getMenu(this.getUsuario());
		}
		return this.menu;
	}
	
	/**
	 * Retorna as opções do menu que o usuário tem acesso dinamicamente
	 * @return
	 */
	public String getMenuHtml() {
		StringBuffer sb = new StringBuffer();
		
		List<AcessoUsuarioPermissao> menu = getMenu();
		for (AcessoUsuarioPermissao opcao : menu) {
			sb.append("<li><a href='" + opcao.getLink() + "'>" + opcao.getDescricao() + "</a></li>");
		}
		return sb.toString();
	}

	public AcessoUsuarioPermissao getAcessoUsuarioPermissao() {
		return usuarioPermissao;
	}

	public void setAcessoUsuarioPermissao(AcessoUsuarioPermissao usuarioPermissao) {
		this.usuarioPermissao = usuarioPermissao;
	}
	
	public String getOpcaoLink(String itemOpcao) {
		if(! this.usuarioPermissao.getItem().equalsIgnoreCase(itemOpcao)) {
			this.usuarioPermissao = this.acessoUsuarioPermissaoDAO.getOpcao(itemOpcao);
		}
		return this.usuarioPermissao.getLink();
	}
	
	public String getOpcaoDescricao(String itemOpcao) {
		if(! this.usuarioPermissao.getItem().equalsIgnoreCase(itemOpcao)) {
			this.usuarioPermissao = this.acessoUsuarioPermissaoDAO.getOpcao(itemOpcao);
		}
		return this.usuarioPermissao.getDescricao();
	}
	
	public boolean getAssociado() {
		if (this.acessoUsuario == null) {
			return false;
		} else {
			return this.acessoUsuario.getTipoCadastro().equals(TipoCadastro.ASSOCIADO.getTipoCadastro());
		}
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public boolean getInstituicao() {
		if (this.acessoUsuario == null) {
			return false;
		} else {
			return this.acessoUsuario.getTipoCadastro().equals(TipoCadastro.INSTITUICAO.getTipoCadastro());
		}
	}
	
	public boolean getPaciente() {
		if (this.acessoUsuario == null) {
			return false;
		} else {
			return this.acessoUsuario.getTipoCadastro().equals(TipoCadastro.PACIENTE.getTipoCadastro());
		}
	}
	
	public boolean getLogado() {
		if (this.acessoUsuario == null) {
			return false;
		} else {
			return true;
		}
	}
	
	public boolean getNaoLogado() {
		if (this.acessoUsuario == null) {
			return true;
		} else {
			return false;
		}
	}
	
	public String telaInicio() {
		return "inicio";
	}
	
	public String telaAssociado() {
		return "menuAssociado";
	}
	
	public String telaInstituicao() {
		return "menuInstituicao";
	}
	
	public String telaPaciente() {
		return "menuPaciente";
	}
	
	public String telaPublico() {
		return "menuPublico";
	}
	
	public String telaAssociadoManter() {
		return validaAcessoOpcao(AcessoMenuOpcao.MANTER_ASSOCIADO);
	}
	
	public String telaAreaAtuacaoManter() {
		return validaAcessoOpcao(AcessoMenuOpcao.MANTER_AREA_ATUACAO);
	}
	
	public String telaArtigoManter() {
		return validaAcessoOpcao(AcessoMenuOpcao.MANTER_ARTIGO);
	}
	
	/**
	 * Valida se o usuário está logado e tem acesso
	 * @return
	 */
	public String validaAcessoOpcao(AcessoMenuOpcao opcao) {
		String retorno = "inicio";
		FacesContext context = FacesContext.getCurrentInstance();
		if (this.acessoUsuario == null) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário Não está Logado",""));
		} else {
			if(this.acessoUsuarioPermissaoDAO.getAcessoMenuOpcao(this.acessoUsuario, opcao)){
				this.titulo = this.acessoUsuarioPermissaoDAO.getOpcaoDescricao();
				retorno 	= this.acessoUsuarioPermissaoDAO.getOpcaoLink();
				try {
					switch (opcao) {
					case MANTER_AREA_ATUACAO:
						AreaAtuacaoHandler areaAtuacaoHandler = new AreaAtuacaoHandler();
						context.getExternalContext().getSessionMap().put("areaAtuacaoHandler", areaAtuacaoHandler);
						break;
					case MANTER_ARTIGO:
						ArtigoHandler artigoHandler = new ArtigoHandler();
						context.getExternalContext().getSessionMap().put("artigoHandler", artigoHandler);
						break;
					case MANTER_ASSOCIADO:
						if(this.acessoUsuario.getTipoCadastro().equals(TipoCadastro.ASSOCIADO.getTipoCadastro())){
							AssociadoHandler associadoHandler = new AssociadoHandler();
							associadoHandler.setAssociado(associadoHandler.getAssociadoDAO().get(acessoUsuario.getId()));
							context.getExternalContext().getSessionMap().put("associadoHandler", associadoHandler);
						} else {
							context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Opção permitida apenas para associados",""));
						}
						break;
					default:
						break;
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else {
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Permissão de acesso negada",""));
			}
		}
		return retorno;
	}
}
